#ifndef CLIENTE_H_
#define CLIENTE_H_

#include "../Common/Socket.h"
#include "Usuario.h"
#include <string>
#define DEJAR_DE_RECIBIR 0
#define DEJAR_DE_ENVIAR 1
#define DEJAR_DE_ENVIAR_Y_RECIBIR 2

class Cliente {
	Socket* socket;
	Usuario usuario;
	bool conectado;

public:
	Cliente(Socket* socket);
	
	//Devuelve True si esta conectado, False si no.
	bool estaConectado();
	
	//Envia un datos
	void enviar(const Json::Value& root);
	
	//Recibe datos
	void recibir(Json::Value& root);
	
	//Shutdown del socket con DEJAR_DE_RECIBIR de parametro.
	void dejarDeRecibir();
	
	//Shutdown del socket con DEJAR_DE_ENVIAR de parametro.
	void dejarDeEnviar();
	
	//Shutdown del socket con DEJAR_DE_ENVIAR_Y_RECIBIR de parametro.
	void dejarDeEnviarYRecibir();
	
	//set usuario.
	void asignarUsuario(Usuario);
	
	//Devuelve el nombre del usuario.
	std::string obtenerNombreDeUsuario();
	
	//Devuelve el puntaje del usuario.
	unsigned getPuntaje();
	
	//Incrementa en "inc" el puntaje actual del usuario.
	void incrementarPuntaje(const unsigned& inc);
	
	//Devuelve el mayor nivel alcanzado del usuario.
	unsigned getMaxNivelAlcanzado() const;
	
	//Incrementa el maximo nivel alcanzado por el usuario
	void incrementarNivel(const unsigned& nivel);

	//Devuelve el usuario
	const Usuario& getUsuario() const;

	virtual ~Cliente();
};

#endif /* CLIENTECONECTADO_H_ */
